package tmt.usercenter.web.domain;

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.tmt.annotation.LazyLoadDefine;
import com.tmt.annotation.LazyLoadMapping;
import com.tmt.annotation.Select2OptionValue;
import com.voodoodyne.jackson.jsog.JSOGGenerator;
import lombok.Getter;
import lombok.Setter;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import tmt.usercenter.web.domain.converter.StringAndListConverter;

import javax.persistence.*;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 客户系统，即授权使用本用户中心的第三方系统。
 */
@Getter
@Setter
@Entity
@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "fieldHandler"})
@EntityListeners({AuditingEntityListener.class})
@JsonIdentityInfo(generator = JSOGGenerator.class)

@LazyLoadDefine({
        @LazyLoadMapping(name = "1", value = {"originSystem"})
})
public class UserInfoConfig extends BaseCreator implements Serializable {

    /**
     * 注册界面显示的必填字段列表，用来控制用户注册界面的显示字段。
     * 效验时也应该动态根据本字段的定义进行。
     * 如果为null, 则表示界面显示所有字段。
     */
    @Select2OptionValue(value = "requiredInfo[]", loaderClass = "com.tmt.annotation.CustomOptionValueLoader")
    @Convert(converter = StringAndListConverter.class)
    @Column(name = "required_info")
    private List<String> requiredInfo = new ArrayList<>();

    /**
     * 禁止修改的字段列表
     */
    @Select2OptionValue(value = "disableUpdate[]", loaderClass = "com.tmt.annotation.CustomOptionValueLoader")
    @Convert(converter = StringAndListConverter.class)
    @Column(name = "disable_update")
    private List<String> disableUpdate = new ArrayList<>();

    /**
     * 值唯一的字段列表
     */
    @Select2OptionValue(value = "uniqueFields[]", loaderClass = "com.tmt.annotation.CustomOptionValueLoader")
    @Convert(converter = StringAndListConverter.class)
    @Column
    private List<String> uniqueFields = new ArrayList<>();

    /**
     * 是否在注册的时候验证邮箱地址。
     */
    @Column(name = "check_email")
    private boolean checkEmail = false;

    /**
     * 是否在注册时强制要求验证手机。
     */
    @Column(name = "check_phone")
    private boolean checkPhone = false;

    /**
     * 是否先验证手机。此时checkPhone必须为true。
     */
    @Column(name = "first_check_phone")
    private boolean firstCheckPhone = false;

    /**
     * 当手机号码不唯一时，一个手机号码能注册的最大用户数量, 为0表示不限制。
     */
    @Column(name = "max_same_mobile", nullable = false)
    private int maxSameMobile = 0;

    /**
     * 验证手机号码最大注册数时，这个属性相同的客户系统看作一个整体。
     */
    @Column(name = "client_group_id")
    private String clientGroupId;

    /**
     * 客户系统的所有用户
     */
    @Select2OptionValue("originSystem.id")
    @OneToOne(optional = false)
    @JoinColumn(name = "origin_system_id", nullable = false)
    private ClientSystem originSystem;
}
